module ALU(
	input [31:0] A,
	input[31:0] B,
	input [2:0] ALU_operation,
	output [31:0] res,
	output zero
    );
    
    wire [31:0] I0,I1,I2,I3,I4,I5,I7,o,So,B1;
    wire [32:0] S;
    assign res=o;
    
    MUX8T1_32_0 MUX8T1_32 (
	  .I0(I0),  // input wire [31 : 0] I0
	  .I1(I1),  // input wire [31 : 0] I1
	  .I2(I2),  // input wire [31 : 0] I2
	  .I3(I3),  // input wire [31 : 0] I3
	  .I4(I4),  // input wire [31 : 0] I4
	  .I5(I5),  // input wire [31 : 0] I5
	  .I6(I2),  // input wire [31 : 0] I6
	  .I7(I7),  // input wire [31 : 0] I7
	  .s(ALU_operation),    // input wire [2 : 0] s
	  .o(o)    // output wire [31 : 0] o
	);
	
	and32_0 and32 (
	  .A(A),      // input wire [31 : 0] A
	  .B(B),      // input wire [31 : 0] B
	  .res(I0)  // output wire [31 : 0] res
	);
    
    or32_0 or32 (
	  .A(A),      // input wire [31 : 0] A
	  .B(B),      // input wire [31 : 0] B
	  .res(I1)  // output wire [31 : 0] res
	);
    
    SignalExt_32_0 SignalExt32 (
	  .S(ALU_operation[2]),    // input wire S
	  .So(So)  // output wire [31 : 0] So
	);
    
    xor32_0 xor32_1 (
	  .A(So),      // input wire [31 : 0] A
	  .B(B),      // input wire [31 : 0] B
	  .res(B1)  // output wire [31 : 0] res
	);
    
    adc_32_0 adc32 (
	  .A(A),    // input wire [31 : 0] A
	  .B(B1),    // input wire [31 : 0] B
	  .C0(ALU_operation[2]),  // input wire C0
	  .S(S)    // output wire [32 : 0] S
	);
    
    assign I2=S[31:0];
    assign I7={31'b0,S[32]};
    
    xor32_0 xor32_0 (
	  .A(A),      // input wire [31 : 0] A
	  .B(B),      // input wire [31 : 0] B
	  .res(I3)  // output wire [31 : 0] res
	);
	
	nor32_0 nor32 (
	  .A(A),      // input wire [31 : 0] A
	  .B(B),      // input wire [31 : 0] B
	  .res(I4)  // output wire [31 : 0] res
	);
	
	srl32_0 srl32 (
	  .A(A),      // input wire [31 : 0] A
	  .B(B),      // input wire [31 : 0] B
	  .res(I5)  // output wire [31 : 0] res
	);
	
	or_bit_32_0 or_bit_32 (
	  .A(o),  // input wire [31 : 0] A
	  .o(zero)  // output wire o
	);
    
endmodule